package gocomm

import (
	"bytes"
	"fmt"
	"html/template"
	"io/ioutil"
	"log"
	"os"
	"path/filepath"
	"strings"
)

/*
 解决golang template 只能文件名字作为模板名称 以及覆盖问题
 使用方法: 通过如下方法 加载模板
   t, err := gocomm.LoadTemplate("views")
	if err != nil {
		panic(err)
	}
	router.SetHTMLTemplate(t)


// loadTemplate
// templateDir 是模板文件的跟目录 如 views  或者 templates

*/
func LoadTemplate(templateDir string) (*template.Template,error) {
	t := template.New("")

	absPath,err:=filepath.Abs(GetCurrentPath()+templateDir)
	if err!=nil{
		log.Fatal(err)
		return t,err
	}


	files,err:=ioutil.ReadDir(absPath)

	if err!=nil{
		log.Fatal(err)
		return t,err
	}
	parentPath:=absPath
	parentName:=""
	for _,f:=  range files{
		if f.IsDir(){
			loadTemplateFiles(absPath,f.Name(),t)
			//模板子文件
		}else{
			//处理当前文件下的模板文件

			tmpl_content, err := readTemplateFile(parentPath,f.Name())
			if err != nil {
				return nil, err
			}
			t, err = t.New(buildTemplateFullName(parentName,f.Name())).Parse(string(tmpl_content))
			if err != nil {
				return nil, err
			}

		}
	}


	printTemplateMap(t)


	return t, nil
}

/*
打印 模板映射
 */
func printTemplateMap(t *template.Template)  {

	var buf bytes.Buffer
	for _, tmpl := range t.Templates() {
		buf.WriteString("\t- ")
		buf.WriteString(tmpl.Name())
		buf.WriteString("\n")
	}

	format:="Loaded HTML Templates (%d): \n%s\n"
	if !strings.HasSuffix(format, "\n") {
		format += "\n"
	}
	fmt.Fprintf(os.Stderr, "[Self Template Parser] "+format, len(t.Templates()), buf.String())

}

/*
 构建完整的模板名称
 如: views/user/index.html 则返回  user/index.html
 */
func buildTemplateFullName(parentName string,templFile string) string {
	if parentName==""{
		return templFile
	}
	return parentName+"/"+templFile
}

/*
读取文件内容
 */
func readTemplateFile(dir string,filename string)  (string,error){
	tmpl_content, err := ioutil.ReadFile(dir+string(os.PathSeparator)+filename)
	return string(tmpl_content),err
}


/*
加载子文件夹
  templateDir: 模板跟目录路径
  templateBaseName: 模板基目录  如 :  users     users/auth
 */
func loadTemplateFiles(templateDir string,templateBaseName string,t *template.Template)  error {

	files,err:=ioutil.ReadDir(templateDir+string(os.PathSeparator)+templateBaseName)

	if err!=nil{
		log.Fatal(err)
		return err
	}
	parentPath:=templateDir+string(os.PathSeparator)+templateBaseName

	for _,f:=  range files{
		if f.IsDir(){
			loadTemplateFiles(templateDir,templateBaseName+"/"+f.Name(),t)
			//模板子文件
		}else{
			//处理当前文件下的模板文件

			tmpl_content, err := readTemplateFile(parentPath,f.Name())
			if err != nil {
				return  err
			}
			t, err = t.New(buildTemplateFullName(templateBaseName,f.Name())).Parse(string(tmpl_content))
			if err != nil {
				return err
			}

		}
	}

	return nil
}